#!/usr/bin/env python

import math
import cairo,Image,glob
import re
import os.path
class Dessin:
    """
    Classe permettant la gestion de l'image en Page7.
    Elle rajoute en premier lieu des croix sur l'image qui representerons les pas de mesure.
    Puis, elle colorie en rouge la croix pour lorsque la mesure est a effectue et en bleu lorsqu'elle est mesuree.
    """
    def __init__(self,fichier):
        """Fonction d'initialisation
        """
        self.fichier=fichier
    
    def dessiner(self,fichier,listdico,step):
        """
        Cette fonction prends l'image donnee par l'utilisateur, la convertit en PNG (Ouvre et enregistre dans le nouveau format)
        Puis dessine dessus les croix
        """
        ##REGEX POUR CONVERTIR LIMAGE de nimporte quel format en PNG :
        #fichier="/test/essai/essai.jpg"
        regex=re.compile('(.*)/(.*)\..*')
        result_regex=regex.findall(fichier)    
        fichierpng=result_regex[0][1]
        # image enregistrer en png pour traitement
        im =  Image.open(fichier)
        im.save(os.path.expanduser('~')+'/.GWA/'+fichierpng+str("_mesure.png"),"PNG")
        #surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
        #print fichierpng+str(".png")
        
        # creation de la surface utiliser pour les formes geometriques de cairo
        surface = cairo.ImageSurface.create_from_png(os.path.expanduser('~')+'/.GWA/'+fichierpng+str("_mesure.png"))
        ctx = cairo.Context (surface)
        ctx.scale(surface.get_width(),surface.get_height())
        WIDTH=surface.get_width()
        HEIGHT=surface.get_height()
        # epaisseur des traits et de leurs couleurs en fonction de la taille de l'image
        if WIDTH <=400 and HEIGHT <= 400:
            ctx.set_line_width(max(ctx.device_to_user_distance(2,2)))
        else:
            ctx.set_line_width(max(ctx.device_to_user_distance(5,5)))

        ctx.set_source_rgb(0,0,0)
        #ctx.set_line_width(0.1)
        ## CONVERSION DE LIMAGE EN PNG ET ROTATION SI NECESSAIRE
        #CREATION DES CROIX
        size= 0.02*((float)(step)/100.0)
        #if step == 50:
        
        proportionX=0.0
        proportionY=0.0
        for element in listdico:
#gestion des proportions du a cairo si x > y => si pas de gestion des proportions la croix sera plus longue en largeur qu'en hauteur
            if WIDTH > HEIGHT :
                proportionX=(float)(HEIGHT)/(float)(WIDTH)
                proportionY=1.0
            else:
                proportionX=1.0
                proportionY=(float)(WIDTH)/(float)(HEIGHT)
#Creation de deux traits formant une croix
        
                #VERTICAL
            ctx.move_to((float)(element["x"])/(float)(WIDTH),((float)(1)-(float)(element["y"])/(float)(HEIGHT))+size*proportionY)
            ctx.line_to((float)(element["x"])/(float)(WIDTH),((float)(1)-(float)(element["y"])/(float)(HEIGHT))-size*proportionY)

            #HORIZONTAL
            ctx.move_to(((float)(element["x"])/(float)(WIDTH))+size*proportionX,((float)(1)-(float)(element["y"])/(float)(HEIGHT)))
            ctx.line_to(((float)(element["x"])/(float)(WIDTH))-size*proportionX,((float)(1)-(float)(element["y"])/(float)(HEIGHT)))
            ctx.stroke()
                    

        surface.write_to_png(os.path.expanduser('~')+'/.GWA/'+fichierpng+str("_mesure.png"))


## UN AUTRE PROGRAMME REMPLI LE TABLEAU => initialise tt les coordonnes a 0
# dico["x"]
# dico["y"]
# dico["shape"]=>initialisation a vide
# puis choisit soit on la fait soit on la fait pas
# si on la fait pas dico["shape"]=rien
# si on la fait rond l'actuelle dico["shape"]=rond
# si on la deja faite dico["shape"]=carre
## APPEL le debut de mon programme pour les croix
## APPEL 2eme partie de mon programme pour dessiner les ROND ET LES CARRE
## RECOIT un dico avec la mesure actuelle et la precedente
    def encours(self,fichier,listdico):
        regex=re.compile('(.*)/(.*)\..*')
        result_regex=regex.findall(fichier)    
        fichierpng=result_regex[0][1]
        surface = cairo.ImageSurface.create_from_png(os.path.expanduser('~')+'/.GWA/'+fichierpng+str("_mesure.png"))
        ctx = cairo.Context (surface)
        ctx.scale(surface.get_width(),surface.get_height())
        WIDTH=surface.get_width()
        HEIGHT=surface.get_height()
        pi=3.14
# gestion des proportions
        if WIDTH > HEIGHT :
            proportionX=(float)(HEIGHT)/(float)(WIDTH)
            proportionY=1.0
        else:
            proportionX=1.0
            proportionY=(float)(WIDTH)/(float)(HEIGHT)
        for element in listdico:
# CREATION CARRE avec gestion des proportions:

            if element["shape"]=="carre":
                # CREATION RECTANGLE :
                # code RGB ici le rouge
                ctx.set_source_rgb(0,0,1)
                # creation dun rectangle proportion
                # 2 premiers parametres le  X et le Y et de depart et les 2 suivants la longueur
                ctx.rectangle(element["x"]/(float)(WIDTH) - 0.025*proportionX , ((float)(1)-element["y"]/(float)(HEIGHT)) - 0.025*proportionY, 0.05*proportionX, 0.05*proportionY)
                ctx.fill()
                
# CREATION ROND  avec gestion des proportions:
            if element["shape"]=="rond":
                ctx.set_source_rgb(1,0,0)
                #element["shape"]="carre"
                ctx.save()
                 
                #print proportionY
                #ctx.scale(proportionX,1)
                if proportionX < 1:
                    ctx.scale(proportionX,1)
                    #X et Y du cercle taille et son diametrei
                    # WTF !!! C'est quoi la difference entre taille et diametre de cercle ?
                    ctx.arc((element["x"]/(float)(WIDTH))*(1.0/proportionX),((float)(1)-element["y"]/(float)(HEIGHT)), 0.02, 0, 2*pi)                    
                if proportionY < 1 :
                    ctx.scale(1,proportionY)
                    ctx.arc((element["x"]/(float)(WIDTH)),((float)(1)-element["y"]/(float)(HEIGHT))*(1.0/proportionY), 0.02, 0, 2*pi)
                ctx.restore()
                ctx.fill()
        surface.write_to_png (os.path.expanduser('~')+'/.GWA/'+fichierpng+str("_mesure.png"))
        #surface.write_to_png (fichier)
            
        return listdico

if __name__=="__main__":
    obj=Dessin("un")
    #obj.dessiner("plaveckycastle.png",25)
    listdico=[]
    dico={}    
    for a in range(25,300,25):
        for b in range(25,225,25):
            dico["x"]=a
            dico["y"]=b
            dico["shape"]="rond"
            listdico.append(dico)
            dico={}
                
    #obj.encours("plaveckycastle.png",listdico)
    WIDTH=100
    HEIGHT=100
    surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
    ctx = cairo.Context (surface)
    ctx.scale(surface.get_width(),surface.get_height())    
    ctx.set_source_rgb(0, 0, 0)
    ctx.rectangle(0.25, 0.25, 0.5, 0.5)
    ctx.fill()
    surface.write_to_png ("test.png")
    

